package rbac

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"store/libs/controller"
	"store/libs/helper"
	"store/logic/rbac"
)

type Admin struct {
	controller.Restful
}

func NewAdminController() *Admin {
	admin := new(Admin)
	admin.Logic = &rbac.AdminLogic{}
	return admin
}

// @Summary 添加管理员
// @Description 添加管理员
// @Accept  application/json,application/xml
// @Produce json,xml
// @Tags    管理员
// @Param  adminInfo   body    rbac.AdminInput     true        "管理员信息"
// @Success 200 {object} controller.Response
// @failure 400 {object} controller.Response
// @Router /admin/rbac/admin [post]
func (this *Admin) Post(ctx *gin.Context) {
	logic4Ctx := this.Logic.Clone(ctx)
	input, err := logic4Ctx.LoadInput()
	if err != nil {
		this.Response(ctx, http.StatusBadRequest, this.FormatError(input, err).Error(), nil)
		return
	}

	id := logic4Ctx.Add(&input)
	if id < 1 {
		this.Response(ctx, http.StatusInternalServerError, "添加失败", nil)
		return
	}

	info, _ := logic4Ctx.View(map[string]interface{}{
		"id": id,
	})
	this.Response(ctx, http.StatusOK, "ok", info)
	return
}

// @Summary 删除管理员
// @Description 删除管理员
// @Accept  application/json,application/xml
// @Produce json,xml
// @Tags    管理员
// @Param  id   query    int     true        "管理员id"
// @Success 200 {object} controller.Response
// @failure 400 {object} controller.Response
// @Router /admin/rbac/admin [delete]
func (this *Admin) Delete(ctx *gin.Context) {
	id, err := this.GetInfoParams(ctx)
	if err != nil {
		this.Response(ctx, http.StatusBadRequest, err.Error(), nil)
		return
	}

	rId := helper.ToInt(id)
	if rId < 0 {
		this.Response(ctx, http.StatusBadRequest, "id最小为1", nil)
		return
	}

	this.Logic.Clone(ctx).Delete(uint64(rId))

	this.Response(ctx, http.StatusOK, "ok", nil)
}

// @Summary 管理员禁用与启用
// @Description 管理员禁用与启用
// @Accept  application/json,application/xml
// @Produce json,xml
// @Tags    管理员
// @Param  id    query    int     true       "管理员id"
// @Param  value body    int     true        "0禁用，1启用"
// @Success 200 {object} controller.Response
// @failure 400 {object} controller.Response
// @Router /admin/rbac/admin/up-or-down [post]
func (this *Admin) UpOrDown(ctx *gin.Context) {
	id, err := this.GetInfoParams(ctx)
	if err != nil {
		this.Response(ctx, http.StatusBadRequest, err.Error(), nil)
		return
	}

	rId := helper.ToInt(id)
	if rId < 0 {
		this.Response(ctx, http.StatusBadRequest, "id最小为1", nil)
		return
	}

	val, err := this.GetUpOrDownParams(ctx)
	if err != nil {
		this.Response(ctx, http.StatusBadRequest, err.Error(), nil)
		return
	}

	this.Logic.Clone(ctx).UpOrDown(uint64(rId), val)

	this.Response(ctx, http.StatusOK, "ok", nil)
}

// @Summary 管理员禁用与启用
// @Description 管理员禁用与启用
// @Accept  application/json,application/xml
// @Produce json,xml
// @Tags    管理员
// @Param  id          query   int                 true        "管理员id"
// @Param  adminInfo   body    rbac.AdminInput     true        "管理员信息"
// @Success 200 {object} controller.Response
// @failure 400 {object} controller.Response
// @Router /admin/rbac/admin [put]
func (this *Admin) Put(ctx *gin.Context) {
	id, err := this.GetInfoParams(ctx)
	if err != nil {
		this.Response(ctx, http.StatusBadRequest, err.Error(), nil)
		return
	}

	logic4Ctx := this.Logic.Clone(ctx)

	input, version, err := logic4Ctx.LoadInput4Update(map[string]interface{}{
		"id": id,
	})

	if err != nil {
		this.Response(ctx, http.StatusBadRequest, this.FormatError(input, err).Error(), nil)
		return
	}

	logic4Ctx.Update(version, input)
	info, _ := logic4Ctx.View(map[string]interface{}{
		"id": id,
	})

	this.Response(ctx, http.StatusOK, "ok", info)
}

// @Summary 获取管理员详情
// @Description 获取管理员详情
// @Tags    管理员
// @Accept  json
// @Produce json
// @Param  id   query    int     true        "管理员id"
// @Success 200 {object} controller.Response
// @failure 400 {object} controller.Response
// @Router /admin/rbac/admin [get]
func (this *Admin) Get(ctx *gin.Context) {
	id, err := this.GetInfoParams(ctx)

	if err != nil {
		this.Response(ctx, http.StatusBadRequest, err.Error(), nil)
		return
	}

	info, exists := this.Logic.Clone(ctx).View(map[string]interface{}{
		"id": id,
	})

	if !exists {
		this.Response(ctx, http.StatusNotFound, "not found", nil)
		return
	}

	this.Response(ctx, http.StatusOK, "ok", info)
}

// @Summary 获取管理员列表
// @Description 获取管理员列表
// @Tags    管理员
// @Accept  json
// @Produce json
// @Param  page       query    int     false        "页码"
// @Param  pageSize   query    int     false        "分页大小"
// @Success 200 {object} controller.Response
// @failure 400 {object} controller.Response
// @Router /admin/rbac/admin [get]
func (this *Admin) GetIndex(ctx *gin.Context) {
	page, pageSize, where, orders := this.GetIndexParams(ctx)
	result := this.Logic.Clone(ctx).Index(page, pageSize, where, orders)

	this.Response(ctx, http.StatusOK, "ok", result)
}
